#include "HeadFile.h"

/*******************************************
函数名称: AC_On()
功	  能: 开启空调函数
参	  数: 无
返 回 值: 无
备	  注: 无
作	  者: skylisan
日	  期: 2021-12-26
********************************************/
void AC_On()
{
    bsp_ir_chip_set_air_cond_all_param(1, 1, 1, 26, 1, 1);
    Save_AC_Para_All(&Table_Parameter);
    Output_Temp = 26;
}

/*******************************************
函数名称: Get_Inside_Outside_Temp_Gap()
功	  能: 测得期望温度和室内温度差值差值
参	  数: 无
返 回 值: 期望温度和室内温度差值的绝对值
备	  注: 在定时器中运行
作	  者: skylisan
日	  期: 2021-12-26
********************************************/
uint16_t Get_Inside_Outside_Temp_Gap()
{
    return abs(Current_Temperature - Outside_Temperature);
}
/*******************************************
函数名称: Fan_Enable()
功	  能: 风扇使能/关停
参	  数: 1/0(布尔值)
返 回 值: 无
备	  注: 无
作	  者: skylisan
日	  期: 2021-12-26
********************************************/
void Fan_Enable(bool Fan_Para)
{
    if (Fan_Para == 0)
    {
        GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, 0);
        Fan_Enable_Ctl = 0;
        AC_WriteFlashParameter_One(FAN_STAT, 0, &Table_Parameter);
    }
    else
    {
        GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, GPIO_PIN_6);
        Fan_Enable_Ctl = 1;
        AC_WriteFlashParameter_One(FAN_STAT, 1, &Table_Parameter);
    }
}

uint16_t IRcounter = 0, hybernet_sgn = 0, Output_Temp = 0;
uint32_t timer_gap_ctl = 10000, hybernet_counter = 0, IRcounterH = 0, hybernet_counterH = 0; // timer_gap_ctl=60
bool Fan_Enable_Ctl = 0;
bool Hybernate_Ctl;
/*******************************************
函数名称: 温度控制命令发送主控函数
功	  能: 对室内温度室外温度及温差数据进行综合决策
参	  数: 无
返 回 值: 发送的红外信号温度值
备	  注: 在定时器中运行, 每5分钟进行一次决策
作	  者: skylisan
日	  期: 2021-12-26
********************************************/
void Main_Temp_Ctl_Statemachine(void)
{
    Humi_Integration();
    Temp_Integration(); //温湿度整合函数
    IRcounter++;
    //    printf("%d\n",IRcounter);
    if (Current_Temperature < 16)
        hybernet_counter++;
    if (IRcounter == timer_gap_ctl)
    {
        IRcounterH = IRcounter;
        hybernet_counterH = hybernet_counter;
        IRcounter = 0;
        hybernet_counter = 0;
        uint16_t IOGAP = Get_Inside_Outside_Temp_Gap(), IOGAP_Lagger = 0;
        if (Current_Humidity >= 85)
        {
            Fan_Enable(0);
            bsp_ir_chip_set_air_cond_all_param(1, 1, 2, AC_Temp_Setup, 3, 1); //强制关闭风扇(继电器控制)启动除湿模式
            Save_AC_Para_All(&Table_Parameter);
        }
        else
        {
            if (Current_Temperature >= Outside_Temperature)
            {
                if (Current_Temperature > 32)
                {
                    Fan_Enable(0);
                    bsp_ir_chip_set_air_cond_all_param(1, 1, 2, AC_Temp_Setup, 3, 1); //强制关闭风扇(继电器控制)启动除湿模式
                    Save_AC_Para_All(&Table_Parameter);
                    Estimate_Temperature = 29; //滞回比较器设置三度的阈值范围
                    Output_Temp = AC_Temp_Setup;
                }
                else if (Current_Temperature <= 32 && Current_Temperature > 29 && Estimate_Temperature == 29)
                {
                    Fan_Enable(0);
                    bsp_ir_chip_set_air_cond_all_param(1, 1, 2, AC_Temp_Setup, 3, 1); //强制关闭风扇(继电器控制)启动除湿模式
                    Save_AC_Para_All(&Table_Parameter);
                    Estimate_Temperature = 29; //滞回比较器设置三度的阈值范围
                    Output_Temp = AC_Temp_Setup;
                }
                else if (Current_Temperature <= 32 && Current_Temperature > 29 && Estimate_Temperature != 29)
                {
                    Fan_Enable(0);
                    bsp_ir_chip_set_air_cond_all_param(1, 1, 1, AC_Temp_Setup, 0, 1);
                    Save_AC_Para_All(&Table_Parameter);
                    Estimate_Temperature = 26;
                    Output_Temp = AC_Temp_Setup;
                }
                else if (Current_Temperature <= 29 && Current_Temperature >= 24 && Estimate_Temperature == 29)
                {
                    Estimate_Temperature = 26;
                    bsp_ir_chip_set_air_cond_all_param(1, 1, 1, AC_Temp_Setup, 0, 1);
                    Fan_Enable(0);
                    Save_AC_Para_All(&Table_Parameter);
                    Output_Temp = AC_Temp_Setup;
                }
                else if (Current_Temperature <= 29 && Current_Temperature >= 24 && Estimate_Temperature != 29) //滞回比较器设置两度的温度范围
                {
                    if (IOGAP - 5 >= 2)
                    {
                        Fan_Enable(1);
                        bsp_ir_chip_set_air_cond_all_param(0, 1, 1, AC_Temp_Setup, 0, 1);
                        Save_AC_Para_All(&Table_Parameter);
                        IOGAP_Lagger = 1;
                        Output_Temp = AC_Temp_Setup;
                    }
                    else if (IOGAP - 5 <= 2 && IOGAP - 5 >= 0 && IOGAP_Lagger == 1)
                    {
                        Fan_Enable(1);
                        bsp_ir_chip_set_air_cond_all_param(0, 1, 1, AC_Temp_Setup, 0, 1);
                        IOGAP_Lagger = 1;
                        Save_AC_Para_All(&Table_Parameter);
                        Output_Temp = 0;
                    }
                    else if (IOGAP - 5 <= 0)
                    {
                        Fan_Enable(0);
                        bsp_ir_chip_set_air_cond_all_param(1, 1, 1, AC_Temp_Setup, 0, 1);
                        Save_AC_Para_All(&Table_Parameter);
                        IOGAP_Lagger = 0;
                        Output_Temp = AC_Temp_Setup;
                    }
                }
                else if (Current_Temperature < 24 && Current_Temperature >= 20)
                {
                    Fan_Enable(0);
                    bsp_ir_chip_set_air_cond_all_param(0, 1, 1, AC_Temp_Setup, 0, 1);
                    Save_AC_Para_All(&Table_Parameter);
                }
                else if (Current_Temperature < 20)
                {
                    Fan_Enable(0);
                    bsp_ir_chip_set_air_cond_all_param(0, 1, 1, AC_Temp_Setup, 0, 1);
                    Save_AC_Para_All(&Table_Parameter);
                }
            }
            else
            {
                Fan_Enable(0);
                if (IOGAP >= 6 && Outside_Temperature >= 24)
                {
                    bsp_ir_chip_set_air_cond_all_param(1, 1, 1, AC_Temp_Setup, 0, 1);
                    Save_AC_Para_All(&Table_Parameter);
                    Output_Temp = AC_Temp_Setup;
                }
                else if (IOGAP >= 6 && Outside_Temperature < 24)
                {
                    bsp_ir_chip_set_air_cond_all_param(0, 1, 1, AC_Temp_Setup, 0, 1);
                    Save_AC_Para_All(&Table_Parameter);
                    Output_Temp = 0;
                }
                else if (IOGAP < 6)
                {
                    if (Current_Temperature >= 24)
                    {
                        bsp_ir_chip_set_air_cond_all_param(1, 1, 1, AC_Temp_Setup, 0, 1);
                        Save_AC_Para_All(&Table_Parameter);
                        Output_Temp = AC_Temp_Setup;
                    }
                    else
                    {
                        bsp_ir_chip_set_air_cond_all_param(0, 1, 1, AC_Temp_Setup, 0, 1);
                        Save_AC_Para_All(&Table_Parameter);
                        Output_Temp = 0;
                    }
                }
                else
                {
                    bsp_ir_chip_set_air_cond_all_param(1, 1, 1, AC_Temp_Setup, 0, 1);
                    Save_AC_Para_All(&Table_Parameter);
                    Output_Temp = AC_Temp_Setup;
                }
                if ((hybernet_counterH / IRcounterH) == 1) //低温"占空比"
                {
                    Hybernate_Ctl = 1;
                    // timer_gap_ctl = 1200; //进入休眠模式, 给出控制指令时间间隔为之前的二十倍  Debug请去掉注释
                    timer_gap_ctl = 10000;
                    IRcounter = 0;
                }
                else
                    // timer_gap_ctl = 60;   //同上
                    timer_gap_ctl = 10000;
            }
        }
    }
}
uint8_t Available_Sensor_Cnt = 0;
/*******************************************
函数名称: Temp_Integration()
功	  能: 温度整合函数
参	  数: 无
返 回 值: 无
备	  注: 无
作	  者: skylisan
日	  期: 2021-01-06
********************************************/
void Temp_Integration(void)
{
    uint8_t Temp_Sum = 0;
    if (Inside_Temp_4 != 0)
        Temp_Sum += Inside_Temp_4, Available_Sensor_Cnt++;
    if (Inside_Temp_3 != 0)
        Temp_Sum += Inside_Temp_3, Available_Sensor_Cnt++;
    if (Inside_Temp_2 != 0)
        Temp_Sum += Inside_Temp_2, Available_Sensor_Cnt++;
    if (Inside_Temp_1 != 0)
        Temp_Sum += Inside_Temp_1, Available_Sensor_Cnt++;
    if (Available_Sensor_Cnt != 0)
        Current_Temperature = Temp_Sum / Available_Sensor_Cnt;
    Available_Sensor_Cnt = 0;
}
/*******************************************
函数名称: Humi_Integration()
功	  能: 湿度整合函数
参	  数: 无
返 回 值: 无
备	  注: 无
作	  者: skylisan
日	  期: 2021-01-06
********************************************/
void Humi_Integration(void)
{
    uint8_t Humi_Sum = 0;
    if (Inside_Humi_4 != 0)
        Humi_Sum += Inside_Humi_4, Available_Sensor_Cnt++;
    if (Inside_Humi_3 != 0)
        Humi_Sum += Inside_Humi_3, Available_Sensor_Cnt++;
    if (Inside_Humi_2 != 0)
        Humi_Sum += Inside_Humi_2, Available_Sensor_Cnt++;
    if (Inside_Humi_1 != 0)
        Humi_Sum += Inside_Humi_1, Available_Sensor_Cnt++;
    if (Available_Sensor_Cnt != 0)
        Current_Humidity = Humi_Sum / Available_Sensor_Cnt;
    Available_Sensor_Cnt = 0;
}
